﻿#ifndef PARAM_H
#define PARAM_H

#include "math.h"
#include "point.h"
#include "station.h"
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QList>
#include <QMap>
#include <QMetaEnum>
#include <QObject>
#include <QSet>
#include <QSettings>
#include <QTextCodec>
class Param : public QObject {
    Q_OBJECT
public:
    static void readParam();
    static void writeParam();
    static void printParam();
    struct IpAndPort  // ip port
    {
        QString ip;
        int     port;
    };
    /*特殊参数*/
    static int     qrcode_to_mid;      //二维码模块在y轴上偏移中心的位置.如果中心为(0,0),二维码为(0,50),那么此值为-50
    static int     agv_id;             // AGV的ID
    static QString agv_ip;             // AGV的接收数据的IP
    static int     agv_sys_data_port;  // AGV的接收数据的端口
    static int     agv_sys_msg_port;   // AGV接收调度信息port
    /*agv的物理参数*/
    static double             wheel_radius;                   //轮子半径
    static double             agv_radius;                     // agv轮子到中心的距离
    static QList< IpAndPort > sys_ip_and_port;                //业务调度的IP和端口
    static QString            sys_pose_ip;                    //位姿调度的接收数据的IP
    static int                sys_pose_port;                  //位姿调度的接收数据的端口
    static int                SysCommunicationFrequency;      //业务调度上传数据周期 单位ms,必须是10的整数。
    static int                SysPoseCommunicationFrequency;  //位姿调度上传数据周期 单位ms,必须是10的整数。
    static int                lower_power;                    //电池低电量报警阀值
    static double             enter_angle_limit;              //进入角度限制
    static int                lift_over_timer;                //升降超时时间
    static float                Fork_Min_Low_limit;             //货叉最低限位
    static float                Fork_Low_limit;                 //货叉低限位
    static float                Fork_Height_limit;              //货叉高限位
    static float                Fork_Max_Height_limit;          //货叉最高限位
    static float                Lift_Pos_Tolerance;             //货叉升降位置容差值

    /*navigation调节参数*/
    static int    distance_precision;    //距离精度,用于停车的判断
    static double radian_precision;      //弧度精度
    static int    horizontal_precision;  //水平精度
    static int    speed_up_unit;         //手动调节速度的最小增加单位
    static int    max_speed_limit;       //运动最大速度限制
    static int    high_precision_speed;  //高精度对接速度
    static int    max_speed;             //允许agv走的最大速度4档
    static int    max_speed_2;           //允许agv走的最大速度3档
    static int    mid_speed;             //允许agv走的中等速度2档
    static int    min_speed;             //允许agv走的最小速度1档
    static int    ready_speed;           //转弯时的速度
    static int    obstacle_speed;        //避障后的速度
    static int    predict_time;          //导航参数计算周期
    static int    turn_degreee_dis;      //弧形转弯签距离
    static double coor_min_speed_kp;     //坐标低速的PID参数 二维码专用
    static double coor_min_speed_ki;
    static double coor_min_speed_kd;
    static double coor_min_speed_integral_saturation;  //积分饱和,防止积分过大
    static double coor_min_speed_adjust_limit;         //调节限制,防止pid输出过大
    static double coor_min_speed_gamma_r;
    static uint   ready_delay_ms;     //转弯用多长时间
    static uint   tracing_delay_ms;   // tracing 完成后延时时间
    static uint   adjust_delay_ms;    // adjust 完成后延时时间
    static int    dis_dec_bais;       //如果tracing经常走多了，可以适当增加此偏差，单位mm
    static int    kMinGammaDistance;  // gama使用距离最小值 小于2000（mm）
    static int    min_distance_limit;
    static int    mid_distance_limit;
    static int    max_distance_limit;
    static int    slow_down_dis;              //起步前执行低速的距离 mm
    static int    close_obstacle_dis;         //关闭避障距离值
    static int    slam_obs_timer;             //绕障前等待时间
    static int    log_timer;                  //记录日志采集周期
    static int    reset_obs_stop_timer;       //停障碍恢复时间
    static int    change_obs_timer;           //避障切换恢复时间
    static int    qrcode_mode_obs_switch;     //二维码对接模式避障智能切换
    static int    qrcode_mode_default_front;  //二维码对接模式障智能切换关闭下强制前避障使用区域
    static int    qrcode_mode_default_back;   //二维码对接模式障智能切换关闭下强制后避障使用区域
    static int    slam_mode_default_max;      //激光导航模式智能切换最大避障值
    static int    slam_mode_default_min;      //激光导航模式智能切换最小避障值
    static int    auto_back_timer;            //停障脱离等待时间
    static int    next_route_timer;           //无法到达终点，加载下段路线段等待时间
    static int    go_on_check_qrcode_timer;   //再次寻找二维码，再次低速行驶时间
    static int    lose_qrcode_dis;            //检测二维码脱轨范围圈
    static int    lose_qrcode_timer;          //检测二维码低速行走读取超时时间
    static int    max_point2line_to_around;   //绕障最大的点到直线距离限制值 mm
    static int    on_the_route_dis_limit;     //车是否路线附近的距离
    static int    close_obs_left;             // UDATE 221027添加左右避障开关
    static int    close_obs_right;            // UDATE 221027添加左右避障开关
    static int    arrive_signal_open_close;   // UDATE 221027添加到位光感屏蔽

    /*电机控制参数*/
    static double jog_acc;                 //驱动器速度模式下的加速度； 单位：rps2 ； “注意：是电机的加减速不是轮子的加减速”
    static double jog_dec;                 //同上意思
    static double dock_acc;                //对接模式的加速度
    static double dock_dec;                //
    static double nomal_acc;               //举升旋转的加速度
    static double nomal_dec;               //
    static double reduction_radio;         //电机轮子的减速比
    static int    left_direction;          // 左轮方向修补
    static int    right_direction;         // 右轮方向修补
    static int    pulse_per_round;         //电机转一圈的脉冲数

    static double length_per_pulse;        //每个脉冲轮子走的距离
    static int    lift_speed;              // rpm
    static int    turn_speed;              // rpm
    static double lift_length_per_pulse;   //升降电机每个脉冲行程距离 单位puls/mm
    static double turn_rad_per_pulse;      //旋转电机每个脉冲旋转角度 单位puls/°
    static int    lift_origin_puls_count;  //升降原点脉冲计数 单位：脉冲数 （绝对值编码器使用）
    static int    turn_origin_puls_count;  //旋转原点脉冲计数 单位：脉冲数 （绝对值编码器使用）
    static double speed_change_k;          //步科电机转换速度系数
    static double acc_change_k;            //步科电机转换加减速度系数
    static double lift_speed_change_k;     //步科举升电机转换速度系数
    static double lift_acc_change_k;       //步科举升电机转换加减速度系数
    /************单舵轮叉车电机参数***********/
    static int    Fork_Veer_pulse_per_round;  //叉车角度电机转一圈的脉冲数
    static int    pos_mode_speed;          //舵轮转角转速 rmp
    static int    pos_mode_acc;            // 转角加速度 rps^2
    static int    pos_mode_dec;             // 转角减速度 rps^2
    static int    Zero_Pulse;               //电机原点脉冲数值
    static int    pulse_per;                //电机一圈脉冲数值
    static double Veer_Wheel_Speed_Reduction_Radio; //转角电机减速比
    static double Walk_Wheel_Speed_Reduction_Radio; //直行电机减速比

    /*串口*/
    static QString IoControl_port_name;
    static int     IoControl_baud_rate;
    static QString qrcode_port_name;
    static int     qrcode_baud_rate;
    static QString battery_port_name;
    static int     battery_baud_rate;
    /*二维码*/
    static QList< Station* > qrcode_station_list;
    static int               qrcode_tag_num;
    static int               qrcode_tag_distance;
    static int               qrcode_tag_id_max_limit;

private:
    explicit Param( QObject* parent = nullptr );
    ~Param();
};

#endif  // PARAM_H
